// utils/util.js - 通用工具函数

/**
 * 格式化时间
 * @param {Date} date - 日期对象
 * @param {String} format - 格式化模板
 * @returns {String}
 */
const formatTime = (date, format = 'YYYY-MM-DD HH:mm:ss') => {
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  const hour = date.getHours()
  const minute = date.getMinutes()
  const second = date.getSeconds()

  return format
    .replace('YYYY', year)
    .replace('MM', padZero(month))
    .replace('DD', padZero(day))
    .replace('HH', padZero(hour))
    .replace('mm', padZero(minute))
    .replace('ss', padZero(second))
}

/**
 * 数字补零
 * @param {Number} n - 数字
 * @returns {String}
 */
const padZero = (n) => {
  return n < 10 ? '0' + n : '' + n
}

/**
 * 防抖函数
 * @param {Function} fn - 要执行的函数
 * @param {Number} delay - 延迟时间（毫秒）
 * @returns {Function}
 */
const debounce = (fn, delay = 500) => {
  let timer = null
  return function(...args) {
    if (timer) clearTimeout(timer)
    timer = setTimeout(() => {
      fn.apply(this, args)
    }, delay)
  }
}

/**
 * 节流函数
 * @param {Function} fn - 要执行的函数
 * @param {Number} delay - 延迟时间（毫秒）
 * @returns {Function}
 */
const throttle = (fn, delay = 500) => {
  let lastTime = 0
  return function(...args) {
    const now = Date.now()
    if (now - lastTime >= delay) {
      fn.apply(this, args)
      lastTime = now
    }
  }
}

/**
 * 深拷贝
 * @param {*} obj - 要拷贝的对象
 * @returns {*}
 */
const deepClone = (obj) => {
  if (obj === null || typeof obj !== 'object') {
    return obj
  }
  
  if (obj instanceof Date) {
    return new Date(obj)
  }
  
  if (obj instanceof Array) {
    return obj.map(item => deepClone(item))
  }
  
  const cloned = {}
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      cloned[key] = deepClone(obj[key])
    }
  }
  
  return cloned
}

/**
 * 验证数字范围
 * @param {Number} value - 值
 * @param {Number} min - 最小值
 * @param {Number} max - 最大值
 * @returns {Boolean}
 */
const isInRange = (value, min, max) => {
  return value >= min && value <= max
}

/**
 * 生成唯一ID
 * @returns {String}
 */
const generateId = () => {
  return 'id_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9)
}

/**
 * Toast提示
 * @param {String} title - 提示内容
 * @param {String} icon - 图标类型
 * @param {Number} duration - 持续时间
 */
const showToast = (title, icon = 'none', duration = 2000) => {
  wx.showToast({
    title: title,
    icon: icon,
    duration: duration
  })
}

/**
 * Loading提示
 * @param {String} title - 提示内容
 */
const showLoading = (title = '加载中...') => {
  wx.showLoading({
    title: title,
    mask: true
  })
}

/**
 * 隐藏Loading
 */
const hideLoading = () => {
  wx.hideLoading()
}

/**
 * 确认对话框
 * @param {String} title - 标题
 * @param {String} content - 内容
 * @returns {Promise}
 */
const showConfirm = (title, content) => {
  return new Promise((resolve, reject) => {
    wx.showModal({
      title: title,
      content: content,
      success: (res) => {
        if (res.confirm) {
          resolve(true)
        } else {
          resolve(false)
        }
      },
      fail: () => {
        reject(false)
      }
    })
  })
}

/**
 * 验证输入
 * @param {String} type - 验证类型
 * @param {String} value - 值
 * @returns {Boolean}
 */
const validate = (type, value) => {
  const patterns = {
    number: /^\d+(\.\d+)?$/,
    integer: /^\d+$/,
    ip: /^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$/,
    port: /^([1-9]\d{0,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/,
    email: /^[^\s@]+@[^\s@]+\.[^\s@]+$/
  }
  
  if (!patterns[type]) {
    return false
  }
  
  return patterns[type].test(value)
}

/**
 * 数组去重
 * @param {Array} arr - 数组
 * @param {String} key - 对象数组的唯一键
 * @returns {Array}
 */
const unique = (arr, key = null) => {
  if (!key) {
    return [...new Set(arr)]
  }
  
  const seen = new Set()
  return arr.filter(item => {
    const k = item[key]
    if (seen.has(k)) {
      return false
    }
    seen.add(k)
    return true
  })
}

/**
 * 数组排序
 * @param {Array} arr - 数组
 * @param {String} key - 排序键
 * @param {String} order - 排序方向（asc/desc）
 * @returns {Array}
 */
const sortBy = (arr, key, order = 'asc') => {
  return arr.sort((a, b) => {
    const aVal = key ? a[key] : a
    const bVal = key ? b[key] : b
    
    if (order === 'asc') {
      return aVal > bVal ? 1 : -1
    } else {
      return aVal < bVal ? 1 : -1
    }
  })
}

/**
 * 颜色转换 - 根据值获取对应颜色
 * @param {Number} value - 值
 * @param {Number} min - 最小值
 * @param {Number} max - 最大值
 * @returns {String}
 */
const getColorByValue = (value, min, max) => {
  if (value <= min) {
    return '#1890ff' // 蓝色（低）
  } else if (value >= max) {
    return '#ff4d4f' // 红色（高）
  } else {
    return '#52c41a' // 绿色（正常）
  }
}

/**
 * 温度单位转换
 * @param {Number} celsius - 摄氏度
 * @param {String} to - 目标单位（F/K）
 * @returns {Number}
 */
const convertTemperature = (celsius, to = 'F') => {
  if (to === 'F') {
    // 摄氏度转华氏度
    return celsius * 9 / 5 + 32
  } else if (to === 'K') {
    // 摄氏度转开尔文
    return celsius + 273.15
  }
  return celsius
}

module.exports = {
  formatTime,
  padZero,
  debounce,
  throttle,
  deepClone,
  isInRange,
  generateId,
  showToast,
  showLoading,
  hideLoading,
  showConfirm,
  validate,
  unique,
  sortBy,
  getColorByValue,
  convertTemperature
}

